/**
 * Copyright (c) 2011-2016, hubin (jobob@qq.com).
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.sigmatrix.h5.service.v2;

import java.io.Serializable;
import java.util.List;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;

/**
 * <p>
 * 顶级 Service
 * </p>
 *
 * @author hubin
 * @Date 2016-04-20
 */
public interface IDBService<T> {

	/**
	 * <p>
	 * 插入一条记录（选择字段，策略插入）
	 * </p>
	 *
	 * @param entity
	 *            实体对象，不能为null
	 * @return boolean
	 */
	boolean insert(T entity);

	/**
	 * <p>
	 * 插入一条记录（全部字段）
	 * </p>
	 *
	 * @param entity
	 *            实体对象，不能为null
	 * @return boolean
	 */
	boolean insertAllColumn(T entity);

	/**
	 * <p>
	 * 根据 ID 删除
	 * </p>
	 *
	 * @param id
	 *            主键ID，不能为null
	 * @param tablePrefix
	 *            表名前缀
	 * @return boolean
	 */
	boolean deleteById(Serializable id, String tablePrefix);

	/**
	 * <p>
	 * 根据 ID 选择修改
	 * </p>
	 *
	 * @param entity
	 *            实体对象 ，不能为null
	 * @return boolean
	 */
	boolean updateById(T entity);

	/**
	 * <p>
	 * 根据 ID 修改全部字段
	 * </p>
	 *
	 * @param entity
	 *            实体对象，不能为null
	 * @return boolean
	 */
	boolean updateAllColumnById(T entity);

	/**
	 * <p>
	 * 根据 ID 查询
	 * </p>
	 *
	 * @param id
	 *            主键ID，不能为null
	 * @param tablePrefix
	 *            表名前缀
	 * @return T
	 */
	T selectById(Serializable id, String tablePrefix);

	/**
	 * <p>
	 * 根据 Wrapper 条件，查询总记录数
	 * </p>
	 *
	 * @param wrapper
	 *            实体对象，不能为null
	 * @return int
	 */
	int selectCount(Wrapper<T> wrapper);

	/**
	 * <p>
	 * 查询列表
	 * </p>
	 *
	 * @param wrapper
	 *            实体包装类 {@link Wrapper}，不能为null
	 * @return
	 */
	List<T> selectList(Wrapper<T> wrapper);

	/**
	 * <p>
	 * 翻页查询
	 * </p>
	 *
	 * @param page
	 *            翻页对象，不能为null
	 * @param wrapper
	 *            实体包装类 {@link Wrapper}，不能为null
	 * @return
	 */
	Page<T> selectPage(Page<T> page, Wrapper<T> wrapper);

}
